package logique.reseau;

import java.util.ArrayList;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Map.Entry;

import logique.calculateur.Evaluations;
import logique.reseau.atouts.AtoutTouristiqueTroncon;
import logique.reseau.caracteristiques.Caracteristique;

/**
 * 
 * @author camille
 *
 */
public class Troncon {

	private int vitesse;
	private int longueur;
	private Route route;

	private Ville ville1;
	private Ville ville2;

	private Hashtable<String, Caracteristique> caracteristiques;
	private ArrayList<AtoutTouristiqueTroncon> atoutsTouristiques;

	private Evaluations evaluations;

	public Troncon() {

		this.route = null;

		this.ville1 = null;
		this.ville2 = null;

		this.evaluations = null;

		this.caracteristiques = new Hashtable<String, Caracteristique>();

		this.atoutsTouristiques = new ArrayList<AtoutTouristiqueTroncon>();
	}

	public Troncon(Route route) {

		this();

		this.route = route;
		this.route.addTroncon(this);
	}

	public Troncon(Route route, Ville ville1, Ville ville2) {
		this(route);

		this.ville1 = ville1;
		this.ville1.addTroncon(this);

		this.ville2 = ville2;
		this.ville2.addTroncon(this);
	}

	public boolean aCaracteristique(String intitule) {
		return (caracteristiques.get(intitule) != null);
	}

	public Caracteristique getCaracteristique(String intitule) {
		return caracteristiques.get(intitule);
	}

	public void addCaracteristique(Caracteristique caracteristique) {
		caracteristiques.put(caracteristique.intitule(), caracteristique);
	}

	public Route getRoute() {
		return route;
	}

	public void setRoute(Route route) {
		this.route = route;
	}

	public Ville getVille1() {
		return ville1;
	}

	public Ville getVille2() {
		return ville2;
	}
	
	public Ville getExtremite(Ville v){
		if (ville1.equals(v)){
			return ville2;
		}
		else {
			if (ville2.equals(v)){
				return ville1;
			}
			else{
				return null;
			}
		}
	}

	public void setVille1(Ville ville) {
		ville1 = ville;
		ville.addTroncon(this);
	}

	public void setVille2(Ville ville) {
		ville2 = ville;
		ville.addTroncon(this);
	}

	public ArrayList<AtoutTouristiqueTroncon> getAtoutsTouristiques() {
		return atoutsTouristiques;
	}

	public void addAtoutTouristique(AtoutTouristiqueTroncon atout) {
		this.atoutsTouristiques.add(atout);
	}

	public int getVitesse() {
		return vitesse;
	}

	public void setVitesse(int vitesse) {
		this.vitesse = vitesse;
	}

	public int getLongueur() {
		return longueur;
	}

	public void setLongueur(int longueur) {
		this.longueur = longueur;
	}
	
	/**
	 * temps de parcours du tronçon à vitesse max
	 * @return
	 */
	public int getDuree(){
		return (int)(longueur / (vitesse/60.0));
	}
	
	public void disconnect(){
		ville1.removeTroncon(this);
		ville2.removeTroncon(this);
		route.removeTroncon(this);
	}

	public synchronized Evaluations getEvaluations() {
		return evaluations;
	}

	public synchronized void setEvaluations(Evaluations evaluations) {
		this.evaluations = evaluations;
	}
	
	public boolean equals(Troncon troncon) {
		return 	troncon.ville1.equals(this.ville1) &&
				troncon.ville2.equals(this.ville2) &&
				troncon.route.equals(this.route);
	}

	@Override
	public String toString() {
		String tronconStr = new String();

		tronconStr += ville1.getNom() + "-" + ville2.getNom() + " : " + longueur + "km, limitation " + vitesse + " km/h, caracteristiques :";

		if (caracteristiques.isEmpty()) {
			tronconStr += " aucune";
		}
		else {
			for (Iterator<Entry<String, Caracteristique>> iterator = caracteristiques.entrySet().iterator(); iterator.hasNext();) {
				Entry<String, Caracteristique> entry = iterator.next();
				tronconStr += " " + entry.getValue().toString();
			}
		}

		tronconStr += ", atouts touristiques :";

		if (atoutsTouristiques.isEmpty()) {
			tronconStr += " aucun";
		}
		else {
			for (AtoutTouristiqueTroncon att : atoutsTouristiques) {
				tronconStr += " " + att.toString();
			}
		}

		return tronconStr;
	}
}
